Skip to content

UI 适配规则梳理

一、当前项目使用到的分辨率:

当前使用中分辨率宽高比宽高比
CV Canvas1136 * 64016:91.775
DH Canvas960 * 7204:31.333 ~
美术效果图1680 * 10201.647~
美术效果图-PAD1360 * 10201.333~
CCB 辅助适配图1386 * 7681.8046875
CCB 辅助适配图-有效区域
1136 * 64016:91.775
CCB 辅助适配图-有效区域-pad1024*7684:31.333 ~

二、主流设备分辨率参考(横屏游戏):

设备类型常见分辨率宽高比宽高比设计分辨率建议
主流手机(Android/iOS)1920×108016:91.778~优先选择
平板(iPad)2048×15364:31.333 ~扩展安全区域
超宽屏手机2560×108021:92.333~增加侧边填充

三、主流旗舰手机分辨率:

品牌机型分辨率宽高比屏幕尺寸
三星Galaxy S25 Ultra3120×1440 (2K)2.166~6.8英寸
Galaxy S24 Ultra3120×1440 (2K)2.166~6.8英寸
苹果iPhone 16 Pro Max2796×12902.167~6.9英寸
iPhone 15 Pro Max2796×12902.167~6.69英寸
小米小米15 Ultra3200×1440 (2K)2.222~6.73英寸
小米15 Pro2670×12002.2256.36英寸
华为Mate 70 Pro+2832×13162.151~6.9英寸
Pura 70 Pro+2844*12602.257~6.8英寸
OPPOFind X8 Ultra2760×12562.197~6.59英寸
Find X7 Ultra3168×1440 (2K)2.26.82英寸
vivoX200 Ultra3168×1440 (2K)2.26.82英寸
荣耀Magic 7 Pro2800×12802.1856.81英寸
GT Pro2800×12642.215~6.78英寸
一加一加133216×1440 (2K)2.233~6.82英寸

四、目前存在的问题:

1、android 非全屏显示,观感差、不符合当代游戏标准;
2、设计分辨率-效果图分辨率使用标准混乱;
3、部分 UI 界面存在背景图黑边、缩放比例不符合设计效果等现象;
4、UI 布局缺少挂靠、贴边、自适应等支持;部分程序代码定义的元素适配死板;

五、android 全面屏实现:

1、配置:

xml
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
</style>

2、布局:

用动态创建的FrameLayout而非XML布局文件

xml
// 动态布局 - MATCH_PARENT
iewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
mFrameLayout = new ResizeLayout(this);
mFrameLayout.setLayoutParams(framelayout_params);

3、代码设置:

cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java

java
public void init() {
    // FrameLayout
    ViewGroup.LayoutParams framelayout_params =
        new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                   ViewGroup.LayoutParams.MATCH_PARENT);

    mFrameLayout = new ResizeLayout(this);

    mFrameLayout.setLayoutParams(framelayout_params);

    // Cocos2dxEditText layout
    ViewGroup.LayoutParams edittext_layout_params =
        new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                   ViewGroup.LayoutParams.WRAP_CONTENT);
    Cocos2dxEditBox edittext = new Cocos2dxEditBox(this);
    edittext.setLayoutParams(edittext_layout_params);


    mFrameLayout.addView(edittext);

    // Cocos2dxGLSurfaceView
    this.mGLSurfaceView = this.onCreateView();

    // ...add to FrameLayout
    mFrameLayout.addView(this.mGLSurfaceView);

    // Switch to supported OpenGL (ARGB888) mode on emulator
    if (isAndroidEmulator())
       this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

    this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
    this.mGLSurfaceView.setCocos2dxEditText(edittext);

    // Set framelayout as the content view
    setContentView(mFrameLayout);

    //region 全面屏显示优化 ====================================
    // 原来被注释的配置代码导致:
    // 1. 未启用LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    // 2. 未设置沉浸式全屏标志
    // 3. 未调整窗口装饰视图的可见区域

    // 解决方案:取消注释并修改为
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    try {
        // 允许内容延伸到刘海区域
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            try {
                Field field = WindowManager.LayoutParams.class.getDeclaredField("layoutInDisplayCutoutMode");
                int cutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                field.setInt(lp, cutoutMode);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 组合沉浸式全屏标志
        int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // Android 12+ 推荐方案
            getWindow().getInsetsController().hide(WindowInsets.Type.systemBars());
        } else {
            getWindow().getDecorView().setSystemUiVisibility(flag);
        }

        // 更新窗口参数
        getWindow().setAttributes(lp);
    } catch (Exception e) {
        e.printStackTrace();
    }
    //endregion 全面屏显示优化 ====================================
}

4、效果对比:

全屏后

image

全屏前

image

六、全屏后需要做的适配调整:

  1. splash 视图全屏适配;
  2. loading 页全屏适配;
  3. 大厅背景图等比缩放;
  4. 大厅 top-title、bottom-bar 背景九宫格横向拉伸;
  5. 调整大厅 top-title、bottom-bar 元素排布,需要拆分、调整现有节点树;
  6. theme 相关 top-title、bottom-bar 适配;
  7. 大厅侧边栏、翻页按钮位置调整;
  8. 关卡背景拉伸适配;
  9. 关卡 spinUI 背景拉伸适配;

七、设计图-效果图规格统一:

  1. 设计分辨率:

    • CV:1136 * 640 (16:9)
    • DH:960 * 720 (4:3)
    • PAD:960 * 720(4:3)
  2. CCB 辅助适配图尺寸:

    • CV:1386 * 640
      目前能适配的极限是 iphone16 promax(2796×1290)
      1290 / 640 * 1386 ~= 2794
      如后续苹果设备继续提高宽高比,该辅助尺寸将不再适用(宽度不够);

      支持超宽屏(21:9)适配: (1494 * 640
      width = 21 / 9 * 640 ~= 1494;

    • DH:1024*768

    • PAD:1024*768

  3. CCB 辅助适配图-有效区域:(不同设备经适配后,保持等比、完全显示的区域)等同于设计分辨率

    • CV:1136 * 640

    • DH:960 720*

    • PAD:960 720*

  4. 效果图:

    • CV:1386 * 768

    • DH、PAD 单独适配(出单独的 CCB):1024 * 768

    • DH、PAD 移植效果图:1024 * 768

      在 CV 的基础上等比放大 min(768 / 640 = 1.2,1136 / 1024 = 1.109375) = 1.109375 后,切成 (1024 * 768)

Released under the MIT License.